package com.sky.aspect;

import com.sky.anno.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.LocalDateTime;

/**
 * @Author: wzw
 * @CreateTime: 2025-09-28  23:00
 * @Description: TODO
 * ctrl + alt + t 弹出提示
 * ctrl + y 删行
 **/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {

     @Before("@annotation(com.sky.anno.AutoFill)")
    public void autoFill(JoinPoint joinPoint) {
         log.info("开始进行数据填充");
         //获取目标方法注解
         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
         Method method = signature.getMethod();
         AutoFill autoFill = method.getAnnotation(AutoFill.class);
         OperationType value = autoFill.value();
         //获取方法参数
         Object[] args = joinPoint.getArgs();
         if (args == null || args.length == 0){
             return;
         }
         Object entity = args[0];
         try {
             //判断注解中的属性值，如果时INSERT，就补充四个字段（创建时间、创建人、更新时间、更新人）
             if (value == OperationType.INSERT){
                 Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                 Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                 Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
                 Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

                 setCreateTime.invoke(entity, LocalDateTime.now());
                 setUpdateTime.invoke(entity, LocalDateTime.now());
                 setCreateUser.invoke(entity, BaseContext.getCurrentId());
                 setUpdateUser.invoke(entity, BaseContext.getCurrentId());

             } else if (value == OperationType.UPDATE) {
                 Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                 Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

                 setUpdateTime.invoke(entity, LocalDateTime.now());
                 setUpdateUser.invoke(entity, BaseContext.getCurrentId());

             }

             //判断注解中的属性值，如果时UPDATE，就补充两个字段（更新时间、更新人）
         } catch (Exception e) {
             throw new RuntimeException(e);
         }


     }
}
